// 基于axios封装网络请求
import theAxios from 'axios'
import router from '@/router'
import Notify from '@/ui/Notify'
import { getToken, removeToken } from './token'
// import { getNewTokenAPI } from '@/api'
const axios = theAxios.create({
  baseURL: 'http://geek.itheima.net', // 基地址
  timeout: 20000// 20秒超时时间（请求20秒无响应直接判定超时）
})
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 目标:统一携带token
// 判断本地有token再携带，判断具体api/index.js里如果没有携带Authorization，我在添加上去
// 未定义叫undefined, null具体的值你得赋予才叫空
// ?．可选链操作符，如果前面对象里没有length，整个表达式原地返回undefined
// 如果getToken（)在原地有值token字符串，才能调用length获取长度
  if (getToken()?.length > 0 && config.headers.Authorization === undefined) {
    // 发起请求之前, 把token携带在请求头上(表明自己身份)
    config.headers.Authorization = `Bearer ${getToken()}`
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(function (response) { // 当状态码为2xx/3xx开头的进这里
  // 对响应数据做点什么
  return response
}, function (error) { // 响应状态码4xx/5xx进这里
  // 对响应错误做点什么
  // console.dir(error)
  if (error.response.status === 401) { // 身份过期
    Notify({ type: 'warning', message: '身份已过期' })
    removeToken()// 先清除token,才能让路由守卫判断失效,放行我去登录页

    // 方法1：强制跳转登录，用户有感知
    router.push('/login')

    // 方法2：使用refresh_token换回新的token再继续使用，js代码实现，用户无感知，效果好
    // const res = await getNewTokenAPI()
    // console.log(res)
  }

  return Promise.reject(error)
})
export default ({ url, method = 'GET', params = {}, data = {}, headers = {} }) => {
  return axios({
    url,
    method,
    params,
    data,
    headers
  })
}
//   return new Promise((resolve, reject) => {
//     // 判断如果params有值, 需要自己写js代码, 把params对象里key和value拼接到url上
//     $.ajax({
//       url,
//       data,
//       headers,
//       type: method,
//       success: (res) => {
//         resolve(res)
//       },
//       error: err => {
//         reject(err)
//       }
//     })
//   })

// 但是上面有局限性
// 导出的axios方法在使用时
/*
// 我在逻辑页面调用时, 传入的这5个配置名字
    axios({
        url: '请求地址',
        method: '请求方式',
        params: {},
        data: {},
        headers: {}
    })
*/
// 问题来了, 万一将来我要更新request.js里封装网络请求的工具
// 把axios换成jquery的$.ajax
// import $ from 'jquery'
// export default $.ajax
/*
 $.ajax({
    url: '请求地址',
    type: '请求方式',
    data: {}, // 没有params
    headers: {}
 })
*/
